【傻瓜版】使用Transmission为本地文件做种子

92次阅读
没有评论

共计 8483 个字符,预计需要花费 22 分钟才能阅读完成。

安装Transmission

sudo apt update
sudo apt install transmission-daemon

配置Transmission

停止服务

sudo systemctl stop transmission-daemon

修改配置文件

sudo nano /etc/transmission-daemon/settings.json

需要自定义的部分配置:

// 下载完成目录 

"download-dir": "/var/lib/transmission-daemon/downloads", 

// 未完成下载目录(可选) 

"incomplete-dir": "/var/lib/transmission-daemon/incomplete", 

"incomplete-dir-enabled": false, 

// 监听端口 

"peer-port": 51413, 

// Web UI 配置 

"rpc-enabled": true, 

"rpc-bind-address": "0.0.0.0", 

"rpc-port": 9091, 

"rpc-authentication-required": true, 

"rpc-username": "transmission", // 自定义用户名 

"rpc-password": "{your-password}", // 保存后会变成加密格式 

"rpc-whitelist-enabled": false, // 关闭白名单以便远程访问 

// 做种设置 

"ratio-limit": 2.0, 

"ratio-limit-enabled": true, 

// 速度限制(0 表示无限制) 

"speed-limit-down": 0, 

"speed-limit-down-enabled": false, 

"speed-limit-up": 0, 

"speed-limit-up-enabled": false, 

// 其他优化设置 

"umask": 2, 

"preallocation": 1, 

"peer-limit-global": 200, 

"peer-limit-per-torrent": 50

创建和管理下载目录

# 创建下载目录
sudo mkdir -p /var/lib/transmission-daemon/downloads
sudo mkdir -p /var/lib/transmission-daemon/incomplete

# 设置正确的权限
sudo chown -R debian-transmission:debian-transmission /var/lib/transmission-daemon/
sudo chmod -R 755 /var/lib/transmission-daemon/

启动并设置开机自启

# 启动服务
sudo systemctl start transmission-daemon

# 设置开机自启
sudo systemctl enable transmission-daemon

# 检查服务状态
sudo systemctl status transmission-daemon

访问和使用 Web UI

在浏览器中访问:http://你的服务器IP:9091

使用你在配置文件中设置的用户名和密码登录。

种子制作交互脚本

#!/bin/bash

# 种子制作交互脚本
# 使用 transmission-create 工具

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 函数:打印彩色输出
print_color() {
local color=$1
local message=$2
echo -e "${color}${message}${NC}"
}

# 函数:检查命令是否存在
check_command() {
if ! command -v transmission-create &> /dev/null; then
print_color $RED "错误: 未找到 transmission-create 命令"
print_color $YELLOW "请先安装 transmission-cli: sudo apt install transmission-cli"
exit 1
fi
}

# 函数:显示标题
show_header() {
clear
print_color $BLUE "=========================================="
print_color $BLUE " Transmission 种子制作工具"
print_color $BLUE "=========================================="
echo
}

# 函数:选择要做种的内容
select_content() {
while true; do
print_color $YELLOW "请输入要做种的文件或目录的完整路径:"
read -e content_path

if [ -z "$content_path" ]; then
print_color $RED "路径不能为空,请重新输入"
continue
fi

if [ ! -e "$content_path" ]; then
print_color $RED "错误: 路径 '$content_path' 不存在"
continue
fi

# 显示选择的内容信息
if [ -f "$content_path" ]; then
file_size=$(du -h "$content_path" | cut -f1)
print_color $GREEN '✓ 选择的文件: '"$content_path"' (大小: '"$file_size"')'
elif [ -d "$content_path" ]; then
dir_size=$(du -sh "$content_path" | cut -f1)
file_count=$(find "$content_path" -type f | wc -l)
print_color $GREEN '✓ 选择的目录: '"$content_path"' (大小: '"$dir_size"', 文件数: '"$file_count"')'
fi

print_color $YELLOW "确认选择这个内容?[Y/n]"
read confirm
if [[ $confirm =~ ^[Nn]$ ]]; then
continue
else
break
fi
done
}

# 函数:选择 Tracker 服务器
select_tracker() {
print_color $YELLOW "请选择 Tracker 服务器:"
echo "1) 使用公共 Tracker 列表 (推荐)"
echo "2) 自定义 Tracker"
echo "3) 输入多个 Tracker"

while true; do
read -p "请选择 [1-3]: " tracker_choice

case $tracker_choice in
1)
# 公共 Tracker 列表
tracker_urls=(
"udp://tracker.opentrackr.org:1337/announce"
"udp://open.tracker.cl:1337/announce"
"udp://9.rarbg.com:2810/announce"
"https://tracker2.ctix.cn:443/announce"
"udp://opentracker.i2p.rocks:6969/announce"
)

tracker_string=""
for tracker in "${tracker_urls[@]}"; do
tracker_string+=" -t $tracker"
done

print_color $GREEN "✓ 使用公共 Tracker 列表"
break
;;
2)
print_color $YELLOW "请输入 Tracker URL:"
read custom_tracker
if [ -n "$custom_tracker" ]; then
tracker_string=" -t $custom_tracker"
print_color $GREEN "✓ 使用自定义 Tracker: $custom_tracker"
break
else
print_color $RED "Tracker URL 不能为空"
fi
;;
3)
print_color $YELLOW "请输入多个 Tracker URL (每行一个,输入空行结束):"
tracker_string=""
while true; do
read multi_tracker
if [ -z "$multi_tracker" ]; then
break
fi
tracker_string+=" -t $multi_tracker"
done
if [ -n "$tracker_string" ]; then
print_color $GREEN "✓ 使用多个 Tracker"
break
else
print_color $RED "至少需要输入一个 Tracker"
fi
;;
*)
print_color $RED "无效选择,请输入 1-3"
;;
esac
done
}

# 函数:选择 Piece 大小
select_piece_size() {
print_color $YELLOW "请选择 Piece 大小 (影响种子效率):"
echo "1) 自动选择 (推荐)"
echo "2) 128 KB (适合小文件 < 50MB)"
echo "3) 256 KB (适合中等文件 50-500MB)"
echo "4) 512 KB (适合大文件 500MB-2GB)"
echo "5) 1024 KB (适合超大文件 2-8GB)"
echo "6) 2048 KB (适合巨型文件 > 8GB)"
echo "7) 4096 KB (适合超巨型文件 > 32GB)"

while true; do
read -p "请选择 [1-7]: " piece_choice

case $piece_choice in
1)
piece_size=""
print_color $GREEN "✓ 使用自动 Piece 大小"
break
;;
2)
piece_size=" -s 128"
print_color $GREEN "✓ 使用 128 KB Piece 大小"
break
;;
3)
piece_size=" -s 256"
print_color $GREEN "✓ 使用 256 KB Piece 大小"
break
;;
4)
piece_size=" -s 512"
print_color $GREEN "✓ 使用 512 KB Piece 大小"
break
;;
5)
piece_size=" -s 1024"
print_color $GREEN "✓ 使用 1024 KB Piece 大小"
break
;;
6)
piece_size=" -s 2048"
print_color $GREEN "✓ 使用 2048 KB Piece 大小"
break
;;
7)
piece_size=" -s 4096"
print_color $GREEN "✓ 使用 4096 KB Piece 大小"
break
;;
*)
print_color $RED "无效选择,请输入 1-7"
;;
esac
done
}

# 函数:选择输出路径
select_output_path() {
default_name=$(basename "$content_path").torrent
default_output="$PWD/$default_name"

print_color $YELLOW "请输入 .torrent 文件输出路径:"
print_color $BLUE "默认: $default_output"
read -e output_path

if [ -z "$output_path" ]; then
output_path="$default_output"
fi

# 确保路径以 .torrent 结尾
if [[ ! "$output_path" =~ \.torrent$ ]]; then
output_path="$output_path.torrent"
fi

# 检查目录是否存在
output_dir=$(dirname "$output_path")
if [ ! -d "$output_dir" ]; then
print_color $YELLOW "目录不存在,是否创建?[Y/n]"
read create_dir
if [[ ! $create_dir =~ ^[Nn]$ ]]; then
mkdir -p "$output_dir"
if [ $? -ne 0 ]; then
print_color $RED "创建目录失败,使用当前目录"
output_path="$PWD/$(basename "$output_path")"
fi
else
output_path="$PWD/$(basename "$output_path")"
fi
fi

print_color $GREEN "✓ 输出路径: $output_path"
}

# 函数:显示配置摘要
show_summary() {
print_color $BLUE "=========================================="
print_color $BLUE " 配置摘要"
print_color $BLUE "=========================================="
echo
print_color $GREEN "内容路径: $content_path"
print_color $GREEN "输出文件: $output_path"
print_color $GREEN "Tracker: ${tracker_string// -t /, }"
if [ -z "$piece_size" ]; then
print_color $GREEN "Piece 大小: 自动"
else
print_color $GREEN "Piece 大小: ${piece_size// -s /} KB"
fi
echo

if [ -f "$content_path" ]; then
content_size=$(du -h "$content_path" | cut -f1)
print_color $BLUE "文件大小: $content_size"
else
content_size=$(du -sh "$content_path" | cut -f1)
file_count=$(find "$content_path" -type f | wc -l)
print_color $BLUE "目录大小: $content_size"
print_color $BLUE "文件数量: $file_count"
fi
echo
}

# 函数:创建种子
create_torrent() {
print_color $YELLOW "开始创建种子文件..."
echo

# 构建命令
command="transmission-create -o '$output_path'$tracker_string$piece_size '$content_path'"

print_color $BLUE "执行命令:"
echo "$command"
echo

# 执行命令
eval $command

if [ $? -eq 0 ] && [ -f "$output_path" ]; then
print_color $GREEN "✓ 种子文件创建成功!"
print_color $GREEN "✓ 文件位置: $output_path"

# 显示种子文件信息
echo
print_color $BLUE "种子文件信息:"
transmission-show "$output_path"

# 询问是否立即开始做种
echo
print_color $YELLOW "是否立即将种子添加到 Transmission 开始做种?[Y/n]"
read add_to_client
if [[ ! $add_to_client =~ ^[Nn]$ ]]; then
add_to_transmission
fi
else
print_color $RED "✗ 种子文件创建失败!"
exit 1
fi
}

# 函数:添加到 Transmission 客户端
add_to_transmission() {
if systemctl is-active --quiet transmission-daemon; then
print_color $YELLOW "正在将种子添加到 Transmission..."

# 确保文件在正确位置(修复目录和特殊字符处理)
print_color $YELLOW "设置做种文件..."

# 获取基础文件名(不带路径)
base_name=$(basename "$content_path")

# 判断是文件还是目录,使用不同的链接方式
if [ -f "$content_path" ]; then
# 单个文件:使用硬链接
sudo ln -f "$content_path" "/var/lib/transmission-daemon/downloads/$base_name" 2>/dev/null
sudo chown debian-transmission:debian-transmission "/var/lib/transmission-daemon/downloads/$base_name"
print_color $GREEN "✓ 文件硬链接创建成功"
elif [ -d "$content_path" ]; then
# 目录:使用符号链接,并处理特殊字符
sudo ln -sf "$content_path" "/var/lib/transmission-daemon/downloads/$base_name"
sudo chown -h debian-transmission:debian-transmission "/var/lib/transmission-daemon/downloads/$base_name"
print_color $GREEN "✓ 目录符号链接创建成功"
fi

# 使用 transmission-remote 直接添加种子
print_color $YELLOW "直接添加种子到 Transmission..."
transmission-remote -n '用户名:密码' -a "$output_path"

if [ $? -eq 0 ]; then
print_color $GREEN "✓ 种子已成功添加到 Transmission"

# 生成磁力链接
print_color $YELLOW "生成磁力链接..."
magnet_link=$(transmission-show -m "$output_path")
print_color $GREEN "✓ 磁力链接: $magnet_link"
echo "$magnet_link" > "${output_path%.torrent}.magnet.txt"
print_color $GREEN "✓ 磁力链接已保存到: ${output_path%.torrent}.magnet.txt"

# 验证种子状态
sleep 2
print_color $YELLOW "验证做种状态..."
transmission-remote -n '用户名:密码' -l

# 强制重新验证文件
print_color $YELLOW "验证文件完整性..."
transmission-remote -n '用户名:密码' -t all --verify
sleep 3
print_color $YELLOW "最终做种状态:"
transmission-remote -n '用户名:密码' -l

else
print_color $RED "✗ 添加种子失败"
fi
else
print_color $RED "Transmission 服务未运行"
fi
}

# 主函数
main() {
show_header
check_command

print_color $GREEN "欢迎使用种子制作向导!"
echo

# 步骤 1: 选择内容
print_color $BLUE "步骤 1/5: 选择要做种的内容"
select_content
echo

# 步骤 2: 选择 Tracker
print_color $BLUE "步骤 2/5: 选择 Tracker 服务器"
select_tracker
echo

# 步骤 3: 选择 Piece 大小
print_color $BLUE "步骤 3/5: 选择 Piece 大小"
select_piece_size
echo

# 步骤 4: 选择输出路径
print_color $BLUE "步骤 4/5: 选择输出路径"
select_output_path
echo

# 步骤 5: 确认并创建
print_color $BLUE "步骤 5/5: 确认配置"
show_summary

print_color $YELLOW "是否开始创建种子文件?[Y/n]"
read final_confirm
if [[ $final_confirm =~ ^[Nn]$ ]]; then
print_color $YELLOW "已取消创建种子文件"
exit 0
fi

create_torrent
}

# 脚本启动
if [ "$(id -u)" -eq 0 ]; then
print_color $YELLOW "警告: 不建议使用 root 用户运行此脚本"
read -p "是否继续?[y/N]: " root_continue
if [[ ! $root_continue =~ ^[Yy]$ ]]; then
exit 1
fi
fi

main

正文完
 0
纪元
版权声明:本站原创文章,由 纪元 于2025-11-06发表,共计8483字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
验证码